import ast import datetime import json import re import uuid import logging import base64 import subprocess import tempfile import easywebdav import os import os.path from odoo import api, fields, models, _ from odoo import tools from odoo.exceptions import ValidationError from .dss_settings import dssSettings from datetime import date from datetime import datetime from dateutil.relativedelta import relativedelta from pyffmpeg import FFmpeg from tuya_iot import TuyaOpenAPI, TUYA_LOGGER from tuya_connector import TuyaOpenAPI, TUYA_LOGGER import sys TUYA_LOGGER.setLevel(logging.DEBUG) _logger = logging.getLogger(__name__) class dssgeraetetypen(models.Model): _name = "dss.geraetetypen" _description = "DigitalSignage Geraetetypen" _inherit = ['mail.thread','mail.activity.mixin'] _rec_name = "geraetename" geraetename = fields.Char('Geraetename', required=True) uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID') geraetetyp = fields.Selection([('SYS','Systemgerät'), ('STE','Steuergerät'), ('DIV','Anderes'), ('ANZ','Anzeigegerät'), ('PLY','Abspielgerät')],tracking=True) # grundsystem = fields.Many2one('dss.systemtypen', string="Gerät ist nutzbar für",tracking=True) grundsystem = fields.Many2many('dss.systemtypen', string="Gerät ist nutzbar für",tracking=True) grundsystem_kennung = fields.Char(string='Kennung', related='grundsystem.kennung',tracking=True) standort = fields.Char('Hauptstandort des Gerätes',tracking=True) farbe = fields.Char('Grundfarbe',tracking=True) has_heizung = fields.Boolean('Mit Heizsystem',tracking=True) has_klima = fields.Boolean('Mit Klimasystem',tracking=True) has_fan = fields.Boolean('Mit Ventiltorensystem',tracking=True) has_tuya = fields.Boolean('Mit Tuyasteuerung',tracking=True) stromzaehler = fields.Many2one('dss.geraetetypen',tracking=True) stromverbrauch_avg = fields.Integer('Stromverbrauch AVG in W',tracking=True) osvorhanden = fields.Boolean('Mit Betriebssystem',tracking=True) osname = fields.Char('Betriebssystem',tracking=True) ostyp = fields.Selection([('Win','Windows'), ('Lin','Linux'), ('And','Android'),('Ras','Raspberry PI'),('Non','Keines bekannt'),('Div','Anderes')],tracking=True); lcd_ausrichtung = fields.Selection([('quer','Horizontal/Querformat'), ('hoch','Vertikal/Hochformat'),('Divers','Andere Art')],'LCD Ausrichtung',tracking=True); lcd_touch = fields.Boolean('Touchsystem',tracking=True) lcd_montage = fields.Selection([('WAN','Wandmontage'), ('FUS','Standfuss rollbar'), ('FI1','Boden verankert 1 Fuss'),('FI2','Boden verankert 2 Füsse'),('FIX','Bodenverankert Blockfuss'),('XXX','Sonstige')],'Montage/Befestigung',tracking=True); lcd_montage_sonstige = fields.Char('Sonstige Montageart',tracking=True) lcd_size = fields.Selection([('42','42 Zoll'), ('55','55 Zoll'), ('65','65 Zoll'),('75','75 Zoll'),('10','10.x Zoll'),('00','Sonstige')],'LCD Größe',tracking=True); lcd_size_sonstige = fields.Char('LCD Sondergröße',tracking=True) led_geraetetyp = fields.Selection([('MOD','LED Modul'),('NET','Netzgerät'), ('REC','Receiving Karte'), ('STE','Steuerkarte'),('LFT','Lüftertyp')],tracking=True) led_module_pixelpitch = fields.Float('Modulpixelpitch',tracking=True) led_module_breite = fields.Integer('Modulbreite mm',tracking=True) led_module_hoehe = fields.Integer('Modulhoehe mm',tracking=True) led_module_pixel_breite = fields.Integer('Modulbreite px',tracking=True) led_module_pixel_hoehe = fields.Integer('Modulhoehe px',tracking=True) led_module_system = fields.Selection([('FIX1','Fix Verschraubt'), ('MAG1','Magnetisch haltend'), ('RIG1','Imbus Veriegelt (vorn)'),('SONS','Sonstige')],'Modul Montage/Befestigung',tracking=True); led_module_system_sonstige = fields.Char('Modulbefestigung Sonstige',tracking=True) led_module_kennung = fields.Char('Modulbezeichnung',tracking=True) led_module_serial = fields.Char('Modulseriennummer',tracking=True) led_module_vendor = fields.Many2one('res.partner','Modul Hersteller',tracking=True) led_receivingcard_vendor = fields.Many2one('res.partner','Receivingcard Hersteller') led_receivingcard_kennung = fields.Char('Receivingcardtyp') led_netzteil_typ = fields.Selection([('SNT','Schaltnetzteil'), ('STN','Steckernetzteil'), ('HNT','Hutschienennetzteil'),('INT','Internes Netzteil')],'Netzteil Bauart',tracking=True); led_netzteil_vendor = fields.Many2one('res.partner','Netzteil Hersteller',tracking=True) led_netzteil_kennung = fields.Char('Netzteilkennung',tracking=True) led_netzteil_spannung = fields.Char('Netzteil Spannung V',tracking=True) led_netzteil_leistung = fields.Char('Netzteil Leistung W',tracking=True) lcd_montage = fields.Selection([('WAN','Wandmontage'), ('FUS','Standfuss rollbar'), ('FI1','Boden verankert 1 Fuss'),('FI2','Boden verankert 2 Füsse'),('FIX','Bodenverankert Blockfuss'),('XXX','Sonstige')],'Montage/Befestigung',tracking=True); lcd_montage_sonstige = fields.Char('Sonstige Montageart',tracking=True) ledcab_module_breite = fields.Integer('Module in Breite',tracking=True) ledcab_module_hoehe = fields.Integer('Module in Hoehe',tracking=True) ledcab_module = fields.Many2one('dss.geraetetypen','Module',tracking=True,domain="['|',('geraetetyp','=','MOD'),('geraetetyp','=','LED')]") hw_anzeige = fields.Many2one('dss.geraetetypen',domain="[('geraetetyp','=','ANZ')]",tracking=True) hw_steuerung = fields.Many2one('dss.geraetetypen',domain="['&',('geraetetyp','=','STE'),('grundsystem_kennung','=','LED')]",tracking=True) hw_player = fields.Many2one('dss.geraetetypen',domain="[('geraetetyp','=','PLY')]",tracking=True) hw_umwelt = fields.Many2one('dss.geraetetypen',domain="['|',('geraetetyp','=','SYS'),('geraetetyp','=','DIV')]",tracking=True) zusatz_integrationen = fields.Many2one('dss.geraetetypen',tracking=True) zusatz_zubehoer = fields.Char('Sonstiges Zubehör',tracking=True) tuya_Geraete_uid = fields.Char('Tuya Geräte UID',tracking=True) tuya_Geraete_id = fields.Char('Tuya Geräte ID', tracking=True) tuya_can_switch = fields.Boolean('Tuya mit Schalter',tracking=True) tuya_has_powervalue = fields.Boolean('Tuya mit Stromzähler',tracking=True) tuya_last_totalpower = fields.Char('Stromzähler Gesamt',tracking=True,readonly=True) tuya_last_lastpower = fields.Char('Stromzähler Aktuell',tracking=True,readonly=True) tuya_last_switchstate = fields.Char('Schalter Aktuell ',tracking=True,readonly=True) @api.model def _default_uuid(self): return str(uuid.uuid4()) @api.depends('grundsystem') def _compute_grundsystem_kennung(self): for syst in self: if syst.grundsystem: syst.grundsystem_kennung = syst.grundsystem.kennung def get_value_from_tuyaresult(self,dataset,valuename): result='0' _logger.info('Resultanfrage:' + str(dataset)+' Feld : '+str(valuename)) for singlepart in dataset: if singlepart: if (singlepart['code'] == valuename): result = singlepart['value'] break return result def pyaction_tuya_readout(self): _logger.info('Tuya Schaltanfrage : Endpoint - ' + str(dssSettings._get_settingvalue(self,'tuya_endpoint')) + ' AccessID ' + str(dssSettings._get_settingvalue(self,'tuya_access_id')) + ' AccessKEY ' + str(dssSettings._get_settingvalue(self,'tuya_access_key'))) openapi = TuyaOpenAPI(dssSettings._get_settingvalue(self,'tuya_endpoint'),dssSettings._get_settingvalue(self,'tuya_access_id'),dssSettings._get_settingvalue(self,'tuya_access_key')) openapi.connect() switchcode = eval('True') commands = {'commands':[{'code':'switch','value': switchcode}]} # result = openapi.post('/v1.0/iot-03/devices/{}/commands'.format(self.tuya_Geraete_id),commands) result = openapi.get('/v1.0/iot-03/devices/{}/status'.format(self.tuya_Geraete_id)) _logger.info('Erfolg ? :' + str(result['success'])) success = result['success'] if success: _logger.info('Erfolgreiche Anfrage :' + str(result['result'])) if self.tuya_has_powervalue: self.tuya_last_totalpower = self.get_value_from_tuyaresult(result['result'],'forward_energy_total') if self.tuya_last_totalpower == '0': self.tuya_last_totalpower = str(int(self.get_value_from_tuyaresult(result['result'], 'add_ele'))/1000) self.tuya_last_lastpower = self.get_value_from_tuyaresult(result['result'],'phase_a') if self.tuya_last_lastpower == '0': self.tuya_last_lastpower = str(int(self.get_value_from_tuyaresult(result['result'], 'cur_power')) / 10) if self.tuya_can_switch: self.tuya_last_switchstate = self.get_value_from_tuyaresult(result['result'],'switch') if self.tuya_last_switchstate == '0': self.tuya_last_switchstate = self.get_value_from_tuyaresult(result['result'], 'switch_1') else: _logger.info('Fehlerhafte Anfrage :' + str(result['msg'])) def pyaction_tuya_switch(self): _logger.info('Tuya Schaltanfrage : Endpoint - ' + str( dss_settings.dssSettings._get_settingvalue(self, 'tuya_endpoint')) + ' AccessID ' + str( dss_settings.dssSettings._get_settingvalue(self, 'tuya_access_id')) + ' AccessKEY ' + str( dss_settings.dssSettings._get_settingvalue(self, 'tuya_access_key'))) openapi = TuyaOpenAPI(dss_settings.dssSettings._get_settingvalue(self, 'tuya_endpoint'), dss_settings.dssSettings._get_settingvalue(self, 'tuya_access_id'), dss_settings.dssSettings._get_settingvalue(self, 'tuya_access_key')) openapi.connect() commands = {'commands': [{'code': 'switch', 'value': not self.tuya_last_switchstate}]} # result = openapi.post('/v1.0/iot-03/devices/{}/commands'.format(self.tuya_Geraete_id),commands) result = openapi.post('/v1.0/iot-03/devices/{}/commands'.format(self.tuya_Geraete_id),commands) _logger.info('Erfolg ? :' + str(result['success'])) success = result['success'] if success: _logger.info('Erfolgreiche Anfrage :' + str(result['result'])) self.pyaction_tuya_readout() else: _logger.info('Fehlerhafte Anfrage :' + str(result['msg']))