class CurrentCostReaderTest(TestCase):
    def setUp(self):
        current_cost_sensor.now = lambda: datetime(2012, 12, 13, 14, 15, 16)
        self.serial_device = DummySerial()
        self.publisher = QueuePublisher()
        self.current_cost_reader = AsyncCurrentCostReader(self.serial_device, self.publisher)

    def tearDown(self):
        self.current_cost_reader.remove_reader()
        self.serial_device.close()

    @async_coro
    def test_read_sensor(self):
        self.serial_device.serial.send(
            '<msg><src>CC128-v1.29</src><dsb>00302</dsb><time>02:57:28</time><tmpr>21.4</tmpr><sensor>1</sensor><id>00126</id><type>1</type><ch1><watts>00305</watts></ch1></msg>\n'.encode())

        event = yield from asyncio.wait_for(self.publisher.queue.get(), 1)
        self.assertDictEqual(event, {'date': (current_cost_sensor.now().isoformat()), 'watt': 305, 'temperature': 21.4})

    @async_coro
    def test_read_sensor_xml_error_dont_break_loop(self):
        self.serial_device.write('<malformed XML>\n'.encode())
        self.serial_device.serial.send(
            '<msg><src>CC128-v1.29</src><dsb>00302</dsb><time>02:57:28</time><tmpr>21.4</tmpr><sensor>1</sensor><id>00126</id><type>1</type><ch1><watts>00305</watts></ch1></msg>\n'.encode())

        event = yield from asyncio.wait_for(self.publisher.queue.get(), 1)
        self.assertDictEqual(event, {'date': (current_cost_sensor.now().isoformat()), 'watt': 305, 'temperature': 21.4})
class TestRfxTrx433e(WithRedis):

    @asyncio.coroutine
    def setUp(self):
        yield from super().setUp()
        self.serial_device = DummySerial()

    def tearDown(self):
        self.serial_device.close()

    @asyncio.coroutine
    def test_read_data(self):
        rfxcom_emiter_receiver.now = lambda: datetime(2015, 2, 14, 15, 0, 0, tzinfo=timezone.utc)
        self.subscriber = yield from self.connection.start_subscribe()
        yield from self.subscriber.subscribe([rfxcom_emiter_receiver.RFXCOM_KEY])
        packet = DummyPacket().load(
            {'packet_length': 10, 'packet_type_name': 'Temperature and humidity sensors', 'sub_type': 1,
             'packet_type': 82, 'temperature': 22.2, 'humidity_status': 0, 'humidity': 0,
             'sequence_number': 1,
             'battery_signal_level': 128, 'signal_strength': 128, 'id': '0xBB02',
             'sub_type_name': 'THGN122/123, THGN132, THGR122/228/238/268'})

        RfxTrx433e(self.serial_device, RedisPublisher(self.connection, rfxcom_emiter_receiver.RFXCOM_KEY),
                   AsyncRedisSubscriber(self.connection, RfxTrx433eMessageHandler(), RFXCOM_KEY_CMD)).handle_temp_humidity(packet)

        message = yield from asyncio.wait_for(self.subscriber.next_published(), 1)
        self.assertDictEqual(dict(packet.data, date=rfxcom_emiter_receiver.now().isoformat()), loads(message.value))

    @asyncio.coroutine
    def test_write_data(self):
        subscriber = AsyncRedisSubscriber(self.connection, RfxTrx433eMessageHandler(), RFXCOM_KEY_CMD).start(for_n_messages=1)
        rfxcom_device = RfxTrx433eForTest(None, RedisPublisher(self.connection, rfxcom_emiter_receiver.RFXCOM_KEY), subscriber)

        yield from self.connection.publish(rfxcom_emiter_receiver.RFXCOM_KEY_CMD, '{"code_device": "1234567", "value": "1"}')
        yield from asyncio.wait_for(subscriber.message_loop_task, 2)

        self.assertEqual(b'0b1100010123456702010f70', binascii.hexlify(rfxcom_device.rfxcom_transport.data_out.pop()))
 def setUp(self):
     yield from super().setUp()
     self.serial_device = DummySerial()
 def setUp(self):
     current_cost_sensor.now = lambda: datetime(2012, 12, 13, 14, 15, 16)
     self.serial_device = DummySerial()
     self.publisher = QueuePublisher()
     self.current_cost_reader = AsyncCurrentCostReader(self.serial_device, self.publisher)